package edu.pe.cayetano.model.bo;

import java.util.Map;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.dao.OrdenServicioDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.model.bean.OrdenServicioDetalleBean;
import edu.pe.cayetano.model.bean.PlanTratamientoDetalleBean;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.Utilitario;
import edu.pe.cayetano.util.UtilitarioSQLQuery;

public class OrdenServicioBO extends BaseBO{
	
	/**
	 * Metodo que establece el query para el listado de ordenes de servicio
	 * */
	public StringBuffer estableceQuery(DynaBean dyna,int codigoUsuario){
		StringBuffer 	query 			= new StringBuffer();
		String 			campo			= Utilitario.getPropertyDynaBean(dyna, "optCampo");
		String 			criterio		= Utilitario.getPropertyDynaBean(dyna, "criterio");
		String 			operacion		= Utilitario.getPropertyDynaBean(dyna, "operacion");
		
		if(ConstantesSECCD.OPERACION_BUSQUEDA.equalsIgnoreCase(operacion)&&operacion!=null){
			if(ConstantesSECCD.CRITERIO_TODOS.equalsIgnoreCase(campo)&&campo!=null){
				query=UtilitarioSQLQuery.devuelveQueryListadoOrdenServicio(String.valueOf(codigoUsuario));
			}
			else{
				query=UtilitarioSQLQuery.devuelveQueryListadoBaseFiltros(campo,criterio,String.valueOf(codigoUsuario));
			}
		}
		if(ConstantesSECCD.OPERACION_LISTADO.equalsIgnoreCase(operacion)&&operacion!=null){
			query=UtilitarioSQLQuery.devuelveQueryListadoOrdenServicio(String.valueOf(codigoUsuario));
		}
		if(ConstantesSECCD.OPERACION_BUSQUEDA_ESPECIFICA.equalsIgnoreCase(operacion)){
			query=UtilitarioSQLQuery.devuelveQueryListadoBaseFiltros(campo,criterio,String.valueOf(codigoUsuario));
		}
		System.out.println("[OrdenServicioBO]:: query en estableceQuery :"+query.toString());
		return query;
	}
	
	/**
	 * Metodo para listab uan orden de servicio 
	 * */
	public BResult listarOrdenServicio(int codigo) throws BusinessException{
		BResult 				retSalida		= null;
		StringBuffer 			query 			= new StringBuffer(); 
		OperacionesComunesDAO	operacionesDAO	= null;
		try{
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			DynaBean dyna = Utilitario.seteaDynaBeanListadoTabla(null,null,null);
		    query = estableceQuery(dyna,codigo);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[OrdenServicioBO] error en metodo listarOrdenServicio generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[OrdenServicioBO] error en metodo listarOrdenServicio generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * Metodo para buscar ordenes de servicio desde el listado de ordenes de servicio 
	 * */
	public BResult buscarOrdenServicio(DynaBean dyna, int codigoUsuario) throws BusinessException{
		BResult 				retSalida		= null;
		OperacionesComunesDAO				operacionesDAO		= null;
		try{
			conectar();
			operacionesDAO	 	= new OperacionesComunesDAO(conn);
			StringBuffer query = estableceQuery(dyna, codigoUsuario);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[OrdenServicioBO] error en metodo buscarOrdenServicio generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[OrdenServicioBO] error en metodo buscarOrdenServicio generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * metodo que inserta una orden de servicio
	 * */
	public BResult insertaOrdenServicio(DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= null;
		try{
			conectar();
			OrdenServicioDAO 	ordenServicioDAO	 	= new OrdenServicioDAO(conn);
			OperacionesComunesDAO operacionesDAO	 	= new OperacionesComunesDAO(conn);
			dyna.set("codigo", operacionesDAO.obtenerCodigoInsercion("ORDEN_SERVICIO"));
			retSalida 	= ordenServicioDAO.insertaOrdenServicio(dyna);
			grabar();
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[OrdenServicioBO] error en metodo insertaOrdenServicio generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[OrdenServicioBO] error en metodo insertaOrdenServicio generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * metodo que edita una orden de servicio
	 * */
	public BResult editaOrdenServicio(DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= null;
		try{
			conectar();
			OrdenServicioDAO ordenServicioDAO	 	= new OrdenServicioDAO(conn);
			retSalida 	= ordenServicioDAO.editaOrdenServicio(dyna);
			grabar();
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[OrdenServicioBO] error en metodo insertaOrdenServicio generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[OrdenServicioBO] error en metodo insertaOrdenServicio generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * metodo que busca una orden de servicio especifica
	 * */
	public BResult buscarOrdenServicioEspecifico(DynaBean dyna) throws BusinessException{
		BResult 					retSalida			= null;
		try{
			conectar();
			OrdenServicioDAO	ordenServicioDAO	= new OrdenServicioDAO(conn);
			retSalida 			= ordenServicioDAO.retornaOrdenServicio(dyna);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(-1);
			retSalida.setMessage("[OrdenServicioBO] error en metodo buscarOrdenServicioEspecifico generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(-1);
				retSalida.setMessage("[OrdenServicioBO] error en metodo buscarOrdenServicioEspecifico generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	
	public Map  generaDetallexOrdenServicio(Map hashtable, String concatenado[],
			String sedes[],String especialidades[],String servicios[],
			String cantidades[],
			String nomSedes[],String nomEspecialidades[],String nomServicios[]){
		OrdenServicioDetalleBean ptdTO = null;
		try {
			for(int i=0;i<=concatenado.length;i++){
				ptdTO = new OrdenServicioDetalleBean();
				ptdTO.setConcatenado(concatenado[i]);
				ptdTO.setSedeID(Utilitario.convierteCadenaToInt(sedes[i]));
				ptdTO.setServicioID(Utilitario.convierteCadenaToInt(especialidades[i]));
				ptdTO.setServicioID(Utilitario.convierteCadenaToInt(servicios[i]));
				
				ptdTO.setSedeNombre(nomSedes[i]);
				ptdTO.setEspecialidadNombre(nomEspecialidades[i]);
				ptdTO.setServicioNombre(nomServicios[i]);
				
				System.out.println("i:"+i+"<"+cantidades[i]+">");
				
				ptdTO.setCantidad(Utilitario.convierteCadenaToInt(cantidades[i]));
				hashtable.put(ptdTO.getConcatenado(), ptdTO);
			} 
		}catch (Exception e) {
				System.out.println("[OrdenServicioBO] : error en generaDetallexOrdenServicio generado por " +e.getMessage());
		}
		return hashtable; 
	}
}
